package data_source.DAO.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import domain.pojo.Funcionario;
import domain.pojo.Usuario;
import util.DefaultException;
import util.Execucao;

/**
 * Classe que implementa métodos de manipulação de dados de funcionários
 * @author Owner
 */
public class FuncionarioDAO extends GeralDAO{
    /**
     * Define que a tabela que será usada é a de funcionarios
     */
    public FuncionarioDAO(){
	super("funcionario");
    }
    
    /**
     * Retorna a quantidade de funcionários que são administradores
     * @return quantidade de admins
     */
    public int getQuantidadeAdmin(){
	int quantidade = 0;
	
	ResultSet rs = consultALL();
	try {
	    while(rs.next())
		if(rs.getBoolean("admin"))
		    quantidade++;
	} catch (SQLException ex) {
	    ex.printStackTrace();
	}
	return quantidade;
    }
    
    /**
     * Quantidade de funcionários
     * @return quantidade de funcionários
     */
    public int getQuantidadeFunc(){
	int quantidade = 0;
	
	ResultSet rs = consultALL();
	try {
	    while(rs.next())
		if(!rs.getBoolean("admin"))
		    quantidade++;
	} catch (SQLException ex) {
	    ex.printStackTrace();
	}
	
	return quantidade;
    }
    
    /**
     * Pega dados dos admins
     * @param quantidade quantidade de objetos que serão retornados
     * @return tabela com dados dos admins
     */
    public Object[][] getDadosAdmin(int quantidade){
	Object[][] data = null;
	ResultSet rs = consultALL();
	try{
	    data = new Object[quantidade+1][5];
	    int i = 0;
	    while ( rs.next () ){
		data[i][0] = rs.getInt("id");
		data[i][1] = rs.getString("nome");
		data[i][2] = rs.getString("login");
		data[i][3] = rs.getString("senha");
		data[i][4] = rs.getBoolean("admin");
		if(Boolean.parseBoolean(data[i][4].toString())){
		    i++;
		}
	    }
	} catch (SQLException e) {
	    e.printStackTrace();
	}
	return data;
    }
    
    /**
     * Pega dados dos funcionários
     * @param quantidade quantidade de objetos que serão retornados
     * @return tabela com dados dos funcionários
     */
    public Object[][] getDadosFunc(int quantidade){
	Object[][] data = null;
	ResultSet rs = consultALL();
	
	try{
	    data = new Object[quantidade+1][5];
	    int i = 0;
	    while ( rs.next () ){
		data[i][0] = rs.getInt("id");
		data[i][1] = rs.getString("nome");
		data[i][2] = rs.getString("login");
		data[i][3] = rs.getString("senha");
		data[i][4] = rs.getBoolean("admin");
		if(!Boolean.parseBoolean(data[i][4].toString()))
		    i++;
	    }
	} catch (SQLException e) {
	    e.printStackTrace();
	}
	return data;
    }
    
    /**
     * Inclui Funcionário no banco de dados
     * @param funcionario funcionário que será adicionado à database
     * @throws DefaultException
     */
    public void incluir(Funcionario funcionario) throws DefaultException{
	String sql = "INSERT INTO funcionarios (login, senha, nome, admin) "
		   + "VALUES " + "('"+ funcionario.getLogin()   +"', MD5('"+
				       funcionario.getSenha()   +"'), '"+
				       funcionario.getNome()    +"', '"+
		                       B2I(funcionario.isAdmin())	+"' )";
	include(sql);
    }
    
    /**
     * Atualiza dados de um funcionário
     * @param funcionario funcionário que será atualizado
     * @throws DefaultException
     */
    public void atualizar(Funcionario funcionario) throws DefaultException{
	String sql = "UPDATE funcionarios SET login = '" + funcionario.getLogin() + "', "
		                        + "senha = '"+ funcionario.getSenha() + "', "
				        + "nome = '"+ funcionario.getNome() + "', "
				        + "admin = '"+ B2I(funcionario.isAdmin()) + "' "
				        + "WHERE id = " + funcionario.getId() + "";
	updateOne(sql);
    }
    
    /**
     * Excluir funcionário utilizando sua id
     * @param id id do funcionário que será deletado
     * @throws DefaultException
     */
    public void excluir( int id) throws DefaultException{
	delete("id",String.valueOf(id));
    }
    
    /**
     * Logar como um funcionário
     * @param login nome de usuário do funcionário
     * @param senha senha do funcionário
     * @return login feito com sucesso ou não
     * @throws DefaultException
     */
    public boolean logar(String login, String senha){
	Usuario user = new Usuario();
	
	String sql = "SELECT * FROM funcionarios WHERE login = ? AND senha = MD5 (?)";
	String[] values = new String[]{login, senha};

	try {
	    ResultSet rs = queryProtect( sql, values );
	    if (rs.next()) {	
		user.setId(rs.getInt("id"));
		user.setLogin(rs.getString("login"));
		user.setSenha(rs.getString("senha"));
		user.setNome(rs.getString("nome"));
		if(rs.getBoolean("admin"))
		    user.setTipo(0);
		else
		    user.setTipo(1);
		Execucao.getInstance(user);
		return true;
	    }
	} catch (SQLException e) {
	    //TODO Alguma coisa
	}
	return false;
    }
    
    /**
     * 
     * @param bool
     * @return
     */
    public int B2I(boolean bool){
	return bool ?  1 : 0;
    }
}
